/*
 * @lc app=leetcode.cn id=914 lang=javascript
 *
 * [914] 卡牌分组
 */

// @lc code=start
/**
 * @param {number[]} deck
 * @return {boolean}
 */
var hasGroupsSizeX = function(deck) {
    let map=new Map()
    for(let i=0;i<deck.length;i++){
        if(map.has(deck[i])){
            map.set(deck[i],map.get(deck[i])+1)
        }else{
            map.set(deck[i],1)
        }
    }
    let res=[]
    function gcd(big,min){
        return   big%min==0?min:gcd(min,big%min)
    }//若大数除以小数为0，则返回小数（最大公约），否则递归大数，此时变为之前小数和更小数。辗转相除法原理，即若一个数为最大公约数，那么大数除以小数的余也能整除最大公约数，a=23*8,b=23*
    map.forEach((v)=>{
        res.push(v)
    })
    return res.reduce((a,b)=>{return gcd(a,b)})>=2
};//辗转相除法加reduce版本
// @lc code=end
function gcd(big,min){
    return   big%min==0?min:gcd(min,big%min)
}//辗转相除法
var hasGroupsSizeX = function(deck) {
    let map=new Map()
    for(let i=0;i<deck.length;i++){
        if(map.has(deck[i])){
            map.set(deck[i],map.get(deck[i])+1)
        }else{
            map.set(deck[i],1)
        }
    }
    let min=Infinity
    let res=[]
    map.forEach((v)=>{
        min=Math.min(v,min)
        res.push(v)
    })
    if(min==1)return false
    for(let j=min;j>=2;j--){
        if(res.every(item=>(item%j==0))){
            return true
        }
    }
    return false
};//不用辗转相除法